home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 49
/
Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso
/
-serious-
/
hardware
/
mccontrol
/
modules
/
ramcard_mcm.asm
< prev
next >
Wrap
Assembly Source File
|
1999-11-29
|
7KB
|
205 lines
;----------------------------------------------------------------------------
; RamCard.mcm by Guido Mersmann
;----------------------------------------------------------------------------
include "Include.i"
;include "SRC.MC_ModuleInclude"
output Sourcecodes:MCControl/Modules/RamCard.mcm
opt o+,w-
;----------------------------------------------------------------------------
Version = 1
Revision = 2
Day = 19
Month = 10
Year = 99
;----------------------------------------------------------------------------
;--- Macros
Version_String MACRO
dc.b "$VER: ",\1,' \<Version>.\<Revision>'," (\<Day>.\<Month>.\<Year>) ",'\2',0
ENDM
;----------------------------------------------------------------------------
;--- Your defines
Card_Frame_SIZEOF = 128
Card_Checksumm_SIZEOF = 1
Card_Terminator_SIZEOF = 1
Card_SuccessCode = $47
Card_ReadMode = $52
Card_WriteMode = $57
RSRESET
FrameHeader_Device rs.b 1 ;$81 Card!
FrameHeader_Mode rs.b 1 ;$52 = read, $57 = write)
FrameHeader_Dummy1 rs.b 2
FrameHeader_FrameHigh rs.b 1
FrameHeader_FrameLow rs.b 1
FrameHeader_WriteSizeOf rs.b 0
FrameHeader_Dummy2 rs.b 2
FrameHeader_Dummy3 rs.b 2
FrameHeader_ReadSizeOf rs.b 0
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
RSSET Module_SIZEOF
;--- User Data
Module_UserData rs.b 0
Module_Offset rs.w 1
Module_Buffer rs.b Card_Frame_SIZEOF+FrameHeader_ReadSizeOf+Card_Checksumm_SIZEOF+Card_Terminator_SIZEOF
;--- Insert Userdata here!
Module_UserData_End rs.b 0
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
DModule_Code rts
DModule_Version dc.w 1
DModule_ID dc.l Module_Identifier
DModule_Flags dc.l 0 ;ModuleF_Delay ;ModuleF_MultiPage
DModule_Exec_Base dc.l 0 ;Filled by MCControl
DModule_Dos_Base dc.l 0 ;Filled by MCControl
DModule_Intuition_Base dc.l 0 ;Filled by MCControl
;--- Card Data
DModule_DelayReadByte dc.l 0 ;Filled by MCControl
DModule_DelayReadBit dc.l 0 ;Filled by MCControl
DModule_DelayWriteByte dc.l 0 ;Filled by MCControl
DModule_DelayWriteBit dc.l 0 ;Filled by MCControl
ds.l 10 ;reserved
;--- Jump Table
DModule_Delay ds.w 3 ;Delay
bra DModule_Open
nop
bra DModule_Close
nop
bra DModule_FrameOpen
nop
bra DModule_FrameClose
nop
bra DModule_ReadCommand
nop
bra DModule_WriteCommand
nop
bra DModule_PADOpen
nop
bra DModule_PADClose
nop
bra DModule_PADCommand
nop
ds.w 3*10 ;reserved
ds.b Module_UserData_End-Module_UserData
;----------------------------------------------------------------------------
Version_String "RamCard.mcm",<by Guido Mersmann>
even
;----------------------------------------------------------------------------
;--- Reset Offset!
DModule_FrameOpen lea Module_Offset+DModule_Code(pc),a0
clr.w (a0)+
move.l #$ffff5a5d,(a0)+
move.l #$ffff5c5d,(a0)+
;--- Cosmetic only! Fill Output Bytes with $ff
moveq #((Card_Frame_SIZEOF/4)+1)-1,d0
moveq #-1,d1
.ClearBuffer_Loop move.l d1,(a0)+
dbra d0,.ClearBuffer_Loop
DModule_FrameClose
DModule_PADOpen
DModule_PADClose
DModule_PADCommand
DModule_Open
DModule_Close moveq #Module_Error_NoError,d0
rts
;----------------------------------------------------------------------------
DModule_ReadCommand
DModule_WriteCommand movem.l d2-d4/a4,-(a7)
lea Module_Offset+DModule_Code(pc),a4
move.w (a4),d4
addq.w #1,(a4)+
;--- Read Output and store Input Byte
move.b (a4,d4.w),d1
move.b d0,(a4,d4.w)
move.b d1,d0
;--- Read Header or Write Header??
;--- This is very tricky, because the FrameHeader_Mode(a4) isn´t valid when
;--- reading the first byte. The handling of the first 6 Bytes is the
;--- same for reading and and writing, so we can ignore this problem!
cmp.b #Card_WriteMode,FrameHeader_Mode(a4)
beq .WriteMode
;--- Make input frame number ready for output! This is tricky again!
;--- Its not required to check frame bytes (low/high), because the
;--- output frame won´t be used before the input gets valid.
move.b FrameHeader_FrameHigh(a4),FrameHeader_Dummy3(a4)
move.b FrameHeader_FrameLow(a4),FrameHeader_Dummy3+1(a4)
cmp.w #FrameHeader_ReadSizeOf,d4
bne .ReadWrite_Done
;--- Now we are calling the real hardware, to get 128 frame bytes!
;--- In addition to that, we code the checksumm and store the result!
moveq #0,d0
move.b FrameHeader_FrameHigh(a4),d0
move.b d0,d2 ;Checksumm (XOR)
lsl.w #8,d0
move.b FrameHeader_FrameLow(a4),d0
eor.b d0,d2 ;Checksumm (XOR)
lea (a4,d4.w),a0
bsr Card_ReadFrame
moveq #Card_Frame_SIZEOF-1,d3
lea (a4,d4.w),a0
.Xor_Loop move.b (a0)+,d1
eor.b d1,d2
dbra d3,.Xor_Loop
move.b d2,(a0)+
move.b d0,(a0)
move.b (a4,d4.w),d0
.ReadWrite_Done movem.l (a7)+,d2-d4/a4
rts
;--- MCControl send Checksumm? Yes, then the frame is ready for transfer.
.WriteMode cmp.w #FrameHeader_WriteSizeOf+Card_Frame_SIZEOF,d4
bne .ReadWrite_Done
;--- Very easy! Just accessing the hardware and write 128 frame bytes.
moveq #0,d0
move.b FrameHeader_FrameHigh(a4),d0
lsl.w #8,d0
move.b FrameHeader_FrameLow(a4),d0
lea FrameHeader_WriteSizeOf(a4),a0
bsr Card_WriteFrame
lea FrameHeader_WriteSizeOf+Card_Frame_SIZEOF+Card_Checksumm_SIZEOF(a4),a0
move.b #$5c,(a0)+
move.b #$5d,(a0)+
move.b d0,(a0)
bra .ReadWrite_Done
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; Insert Hardware read/write code below! (> = Input, < = Output)
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; Card_ReadFrame
; >a0.l Pointer on Destination
; >d0.l Number of Frame
; <d0.b Card_SuccessCode = Ok, NULL = Error
; Just like AmigaOS!! Only change a0,a1,d0,d1!!!
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Card_ReadFrame lea RAMCARD,a1
mulu #Card_Frame_SIZEOF,d0
add.l d0,a1
moveq #Card_Frame_SIZEOF-1,d0
.Loop move.b (a1)+,(a0)+
dbra d0,.Loop
moveq #Card_SuccessCode,d0 ;NoError
rts
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; Card_WriteFrame
; >a0.l Pointer on Source
; >d0.l Number of Frame
; <d0.b Card_SuccessCode = Ok, NULL = Error
; Just like AmigaOS!! Only change a0,a1,d0,d1!!!
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Card_WriteFrame lea RAMCARD,a1
mulu #Card_Frame_SIZEOF,d0
add.l d0,a1
moveq #Card_Frame_SIZEOF-1,d0
.Loop move.b (a0)+,(a1)+
dbra d0,.Loop
moveq #Card_SuccessCode,d0 ;NoError
rts
;----------------------------------------------------------------------------
Section "RamCard",BSS
RAMCARD ds.b 2*65536